/*
 * @Author: sympsel sympsel@outlook.com
 * @Date: 2025-07-17 12:08:42
 * @LastEditors: sympsel sympsel@outlook.com
 * @LastEditTime: 2025-07-17 12:35:49
 * @FilePath: \work25_7_17\src\Queue.c
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include "Queue.h"

// 初始化队列 
Queue* QueueInit() {
    Queue* queue = MALLOC(Queue, 1);
    queue->_front = queue->_rear = NULL;
    return queue;
}
// 队尾入队列 
void QueuePush(Queue* q, QDataType data) {
    assert(q);
    QNode* newNode = MALLOC(QNode, 1);
    newNode->_data = data;
    newNode->_next = NULL;
    if (QueueEmpty(q)) {
        q->_front = q->_rear = newNode;
    } else {
        q->_rear->_next = newNode;
        q->_rear = newNode;
    }
} 
// 队头出队列 
void QueuePop(Queue* q) {
    assert(q);
    if (QueueEmpty(q)) {
        return;
    }
    QNode* temp = q->_front;
    q->_front = q->_front->_next;
    free(temp);
    if (QueueEmpty(q)) {
        q->_rear = NULL;
    }
}
// 获取队列头部元素 
QDataType QueueFront(Queue* q) {
    return q->_front->_data;
}
// 获取队列队尾元素 
QDataType QueueBack(Queue* q) {
    return q->_rear->_data;
} 
// 获取队列中有效元素个数 
int QueueSize(Queue* q) {
    int cnt = 0;
    for (QNode* cur = q->_front; cur; cur = cur->_next) {
        cnt++;
    }
    return cnt;
}
// 检测队列是否为空，如果为空返回非零结果，如果非空返回0 
bool QueueEmpty(Queue* q) {
    return q->_front == NULL;
}
// 销毁队列 
void QueueDestroy(Queue* q) {
    while (!QueueEmpty(q)) {
        QueuePop(q);
    }
    free(q);
}